/*
https://dart.cn/guides/language/effective-dart/style
 */
import 'dart:html';
import 'dart:math';

void main() {}

//元数据注解的类
class Foo {
  const Foo([Object? arg]);

  void printArg() {}
}

@Foo('子类 A')
class A {}

@Foo()
class B {}

//如果注解类的构造函数是无参函数，则可以使用一个 lowerCamelCase 风格的常量来初始化这个注解。
const foo = Foo();

@foo
class C {}

/*
  使用 UpperCamelCase 风格类型作为扩展名
  Linter rule: camel_case_extensions

  与类型命名一样，扩展 的名称也应大写每个单词的首字母（包括第一个单词），并且不使用分隔符。

 */

extension MyFancyList<T> on List<Type> {}

extension SmartIterable<T> on Iterable<T> {}

/*
  要 在库，package，文件夹，源文件 中使用 lowercase_with_underscores 方式命名。
  Linter rules: file_names, package_names

  一些文件系统不区分大小写，所以很多项目要求文件名必须是小写字母。使用分隔符这种形式可以保证命名的可读性。使用下划线作为分隔符可确保名称仍然是有效的Dart标识符，如果语言后续支持符号导入，这将会起到非常大的帮助。

 */
/*
    good
        my_package
        └─ lib
           └─ file_system.dart
           └─ slider_menu.dart

   bad
      mypackage
      └─ lib
         └─ file-system.dart
         └─ SliderMenu.dart

   如果你 选择命名库，本准则给定了 如何 为库取名。如果需要，可以在文件中 省略 库指令。


   要 用 lowercase_with_underscores 风格命名库和源文件名。
   Linter rule: library_prefixes

   good
      import 'dart:math' as math;
      import 'package:angular_components/angular_components.dart' as angular_components;
      import 'package:js/js.dart' as js;


   bad
      import 'dart:math' as Math;
      import 'package:angular_components/angular_components.dart' as angularComponents;
      import 'package:js/js.dart' as JS;

 */

/*
  要 使用 lowerCamelCase 风格来命名其他的标识符。
  Linter rule: non_constant_identifier_names

  类成员、顶级定义、变量、参数以及命名参数等 除了第一个单词，每个单词首字母都应大写，并且不使用分隔符。
 */

// good
var count = 3;
// HttpRequest httpRequest;
void align(bool clearItems) {}

/*
  推荐 使用 lowerCamelCase 来命名常量。
  Linter rule: constant_identifier_names

  在新的代码中，使用 lowerCamelCase 来命名常量，包括枚举的值。
 */

//good
const pi = 3.14;
const defaultTimeout = 10000;
final urlSchem = RegExp('^([a-z]+):');

class Dice {
  static final numberGenerator = Random();
}

/*
  bad
      const PI = 3.14;
      const DefaultTimeout = 1000;
      final URL_SCHEME = RegExp('^([a-z]+):');

      class Dice {
        static final NUMBER_GENERATOR = Random();
      }
 */

/*
  把超过两个字母的首字母大写缩略词和缩写词当做一般单词来对待。
  首字母大写缩略词比较难阅读，特别是多个缩略词连载一起的时候会引起歧义。例如，一个以 HTTPSFTP 开头的名字，没有办法判断它是指 HTTPS FTP 还是 HTTP SFTP。

  为了避免上面的情况，缩略词和缩写词要像普通单词一样首字母大写。

  例外情况 两个字母情况下，类似 IO (input/output) 这样的 缩略词 要全大写。另外，两个字母的 缩写词 比如 ID (identification) 与其他常规单词一样，首字母大写即可: Id。

 */

//good
class HttpConnection {}

class DBIOPort {}

class TVVcr {}

class MrRogers {}

var httpRequest = "";
var uiHandler = '';
var userId = '';
// ID id;


/*
  PREFER using _, __, etc. for unused callback parameters.
  Sometimes the type signature of a callback function requires a parameter, but the callback implementation doesn’t use the parameter. In this case,
  it’s idiomatic to name the unused parameter _. If the function has multiple unused parameters, use additional underscores to avoid name collisions: __, ___, etc.

  good
      futureOfVoid.then((_) {
        print('Operation complete.');
      });

 */

//不要使用前缀字母
//good
var defaultTimeout2 = 2000;
//bad
var kDefaultTimeout = 1000;


/*
  DON’T explicitly name libraries// 不显示地命名库
  Appending a name to the library directive is technically possible, but is a legacy feature and discouraged.

  Dart generates a unique tag for each library based on its path and filename. Naming libraries overrides this generated URI. Without the URI, it can be harder for tools to find the main library file in question.

  示例代码
  bad
    library my_library;

  good
  @TestOn('browser')
  library;

 */

/*
  顺序
  为了使文件前面部分保持整洁，我们规定了关键字出现顺序的规则。每个“部分”应该使用空行分割。

  A single linter rule handles all the ordering guidelines: directives_ordering.

  要 把 “dart:” 导入语句放到其他导入语句之前。
  Linter rule: directives_ordering

  good

  import 'dart:async';
  import 'dart:html';

  import 'package:bar/bar.dart';
  import 'package:foo/foo.dart';

 */


/*
  要 把 “package:” 导入语句放到项目相关导入语句之前。
  Linter rule: directives_ordering

  import 'package:bar/bar.dart';
  import 'package:foo/foo.dart';

  import 'util.dart';

 */

/*
  要 把导出 (export) 语句作为一个单独的部分放到所有导入语句之后

  good

  import 'src/error.dart';
  import 'src/foo_bar.dart';

  export 'src/error.dart';


  bad

   import 'src/error.dart';
   export 'src/error.dart';
   import 'src/foo_bar.dart';

 */

/*
   要 按照字母顺序来排序每个部分中的语句

   good

    import 'package:bar/bar.dart';
    import 'package:foo/foo.dart';

    import 'foo.dart';
    import 'foo/foo.dart';


    bad

    import 'package:foo/foo.dart';
    import 'package:bar/bar.dart';

    import 'foo/foo.dart';
    import 'foo.dart';

 */

/*
  避免 单行超过 80 个字符。

  可读性研究表明，长行的文字不易阅读，长行文字移动到下一行的开头时，眼睛需要移动更长的距离。这也是为什么报纸和杂志会使用多列样式的文字排版。

  如果你真的发现你需要的文字长度超过了 80 个字符，根据我们的经验，你的代码很可能过于冗长，而且有方式可以让它更紧凑。最常见的的一种情况就是使用 VeryLongCamelCaseClassNames （非常长的类名字和变量名字）。
  当遇到这种情况时，请自问一下：“那个类型名称中的每个单词都会告诉我一些关键的内容或阻止名称冲突吗？”，如果不是，考虑删除它。

  注意，dart format 能自动处理 99% 的情况，但是剩下的 1% 需要你自己处理。 dart format 不会把很长的字符串字面量分割为 80 个字符的列，所以这种情况你需要自己手工确保每行不超过 80 个字符。

  例外： 当 URI 及文件路径出现在注释或字符串中时（通常在导入和导出语句中），即使文字超出行限制，也可能会保留在一行中。这样可以更轻松地搜索给定路径的源文件。

  Exception: Multi-line strings can contain lines longer than 80 characters because newlines are significant inside the string and splitting the lines into shorter ones can alter the program.

 */

/*

  要 对所有流控制结构使用花括号。
  Linter rule: curly_braces_in_flow_control_structures

  这样可以避免 dangling else（else悬挂）的问题

  good
    if (isWeekDay) {
      print('Bike to work!');
    } else {
      print('Go dancing or read a book!');
    }



  这里有一个例外：一个没有 else 的 if 语句，并且这个 if 语句以及它的执行体适合在一行中实现。在这种情况下，如果您愿意，可以不用括号：
  good
  if (arg == null) return defaultValue;


  但是，如果执行体包含下一行，请使用大括号：


  good
   if (overflowChars != other.overflowChars) {
      return overflowChars < other.overflowChars;
    }


  bad

    if (overflowChars != other.overflowChars)
     return overflowChars < other.overflowChars;

 */






